home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy001 / graph / graph20.arj / DEMOS / PING / PING.ASM < prev    next >
Encoding:
Assembly Source File  |  1996-08-01  |  13.6 KB  |  361 lines

  1. ;;;; PING-PONG es el típico juego de la pelotita y los 2 bates.
  2. ;;;;;;; Por   N A V I   D. j.
  3. ;;
  4. ;;;       Vilamarxant * Enero * 1996
  5.  
  6. .MODEL TINY
  7. LOCALS @@
  8. .STACK
  9. .386
  10.  
  11. ;;;;;;;;;;;;;;;;;;
  12. ;;;;  EQUIVALENTES
  13. ;;;;;;;;;;;;;;;;;;
  14.  
  15. LastKey         EQU     mapa_teclado
  16. ESC             EQU     mapa_teclado+1
  17. NUMERO1         EQU     mapa_teclado+2
  18. NUMERO2         EQU     mapa_teclado+3
  19. FlechaIzq       EQU     mapa_teclado+18h
  20. FlechaDer       EQU     mapa_teclado+19h
  21.  
  22. LONGxBATE       EQU     30
  23. LONGyBATE       EQU     10
  24. LONGxBOLA       EQU     10
  25. LONGyBOLA       EQU     10
  26.  
  27. INTRO           EQU     0Dh,0Ah         ;  Código de retorno de carro.
  28. BEL             EQU     07h             ;  Código del maldit... pitidito.
  29. EndOfText       EQU     '$'             ;  Código fin de cadena.
  30.  
  31. ;;;;;;;;;;;;;;;;;;;
  32. ;;;;  AREA DE DATOS
  33. ;;;;;;;;;;;;;;;;;;;
  34.  
  35. .DATA
  36. Presentacion    DB      INTRO
  37.   DB  '    NAVI  Dj.  presenta...',BEL,BEL,BEL,BEL,BEL,BEL,INTRO
  38.   DB  '                        P I N G - P O N G', INTRO
  39.   DB  '                 La reedición de un clásico :->.',INTRO,INTRO
  40.   DB  '       Creado en ASSEMBLER un "magnífico" dia de verano',INTRO
  41.   DB  '                          del año 1996.',INTRO,INTRO
  42.   DB  '     Para crear este juego he  utilizado la librería gráfica',INTRO
  43.   DB  '                            GRAPH 2.0b',INTRO
  44.   DB  '       Creada por mí mismo en  ASSEMBLER puro y disponible',INTRO
  45.   DB  '             para todo el mundo en la forma CARD-WARE',INTRO
  46.   DB  '     Puedes jugar con las teclas O y P para moverte hacia los',INTRO
  47.   DB  '           lados. Opción de 2 jugadores no disponible.',INTRO,INTRO
  48.   DB  ' Para más información:',INTRO
  49.   DB  INTRO,INTRO,INTRO,INTRO
  50.   DB  '     Ivan Gadea Saez',INTRO
  51.   DB  '   Crt\de Lliria  Nº57',INTRO
  52.   DB  '       Vilamarxant',INTRO
  53.   DB  '         Valencia',INTRO,EndOfText
  54.  
  55.  
  56. PaletaJuego     DB      'PAL01.PIN',0           ;  Paleta del propio juego.
  57. HdlPalJuego     DB      0                       ;  Handle de la paleta.
  58.  
  59. SpriteBate      DB      'SPR01.PIN',0           ;  Sprite del bate.
  60. HdlSprBate      DB      0                       ;  Handle del sprite del bate.
  61.  
  62. SpriteBola      DB      'SPR02.PIN',0           ;  Sprite de la bola.
  63. HdlSprBola      DB      0                       ;  Handle del sprite de la bola.
  64.  
  65. FondoPgPg       DB      'GRF01.PIN',0           ;  Fondo en el juego.
  66. HdlFondJuego    DB      0                       ;  Handle del fondo del juego.
  67.  
  68. MenuOpciones    DB      'GRF02.PIN',0           ;  Menú inicial.
  69. HdlMenu         DB      0                       ;  Handle del menú.
  70.  
  71. HdlJuego        DB      0       ;  La pantalla virtual del juego.
  72. XINCbola        DB      0
  73. YINCbola        DB      0       ;  Incremento X e Y de la bola.
  74. Ybola           DW      0
  75. Xbola           DW      0       ;  Coordenadas X e Y de la bola.
  76. N               DB      0       ;  Variable auxiliar.
  77. Xbate1          DW      0       ;  Bate player 1.
  78. Xbate2          DW      0       ;  Bate ordenador o player 2.
  79.  
  80. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  81. ;;;;  FUNCIONES Secundarias
  82. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  83.  
  84. .CODE
  85. INCLUDE GRFLIB2.INC             ;  Funciones graficas «GRAPH 2.0»
  86. INCLUDE TECLADO.INC             ;  Funciones del teclado.
  87.  
  88. CargaGraficos   PROC
  89.                 MOV     DX, Offset PaletaJuego
  90.                 CALL    CargaPaleta     ;  Carga la paleta.
  91.                 CALL    TrataError
  92.                 MOV     [HdlPalJuego], AL
  93.                 MOV     AH, AL
  94.                 XOR     AL, AL
  95.                 XOR     BL, BL
  96.                 CALL    PonPaleta       ;  Y la pone.
  97.  
  98.                 MOV     DX, Offset SpriteBate
  99.                 MOV     BX, LONGxBATE
  100.                 MOV     CX, LONGyBATE
  101.                 CALL    CargaSprite     ;  Carga el sprite del bate.
  102.                 CALL    TrataError
  103.                 MOV     [HdlSprBate], AL
  104.  
  105.                 MOV     DX, Offset SpriteBola
  106.                 MOV     BX, LONGxBOLA
  107.                 MOV     CX, LONGyBOLA
  108.                 CALL    CargaSprite     ;  Carga el sprite de la bola.
  109.                 CALL    TrataError
  110.                 MOV     [HdlSprBola], AL
  111.  
  112.                 CALL    CreaVirtual
  113.                 CALL    TrataError
  114.                 MOV     [HdlFondJuego], AL
  115.                 MOV     DX, Offset FondoPgPg
  116.                 CALL    LeePCX
  117.                 CALL    TrataError      ;  No me preocupo por la paleta por
  118.                 RET                     ; ser la misma durante todo el juego.
  119. CargaGraficos   ENDP
  120.  
  121. PonPresentacion PROC
  122.                 MOV     AX, 0003h
  123.                 INT     10h             ;  Borrar la pantalla en modo mono.
  124.  
  125.                 MOV     DX, Offset Presentacion
  126.                 MOV     AH, 9
  127.                 INT     21h             ;  Función del DOS para presentar
  128.                                         ; textos en pantalla.
  129.   @@Tecla:      IN      AL, 60h
  130.                 CMP     AL, 127d
  131.                 JNB   @@Tecla           ;  Espera a la pulsación de una tecla.
  132.                 RET
  133. PonPresentacion ENDP
  134.  
  135. MenuInicial     PROC
  136.                 CALL    CreaVirtual
  137.                 CALL    TrataError
  138.                 MOV     [HdlMenu], AL
  139.                 MOV     DX, Offset MenuOpciones
  140.                 CALL    LeePCX          ;  Carga el gráfico.
  141.                 PUSH    AX
  142.                 MOV     AH, AL
  143.                 XOR     AL, AL
  144.                 XOR     BL, BL          ;  Ponemos los colores de la paleta.
  145.                 CALL    PonPaleta
  146.                 CALL    TrataError
  147.                 POP     AX
  148.                 CALL    DestPaleta      ;  Liberamos la memoria usada.
  149.                 CALL    TrataError
  150.  
  151.                 MOV     AL, [HdlMenu]
  152.                 XOR     AH, AH
  153.                 CALL    CopiaPantalla   ;  Visualiza el menu.
  154.                 CALL    TrataError
  155.  
  156.                 MOV     AL, [HdlMenu]
  157.                 CALL    DestVirtual     ;  Libera la zona de memoria.
  158.                 CALL    TrataError
  159.                 CALL    FlushKbd        ;  Borramos el mapa de teclas.
  160.  
  161.   @@CMPulsacion:CMP     [mapa_teclado+1], 1
  162.                 JNE   @@NoESC
  163.                 XOR     AX, AX
  164.                 RET
  165.   @@NoESC:      CMP     [mapa_teclado+2], 1
  166.                 JNE   @@No1
  167.                 MOV     AX, 1
  168.                 RET
  169.   @@No1:        CMP     [mapa_teclado+3], 1
  170.                 JNE   @@CMPulsacion
  171.                 MOV     AX, 2
  172.                 RET
  173. MenuInicial     ENDP
  174.  
  175. ;;;;;;;;;;;;;;;;;;;;;;
  176. ;;;;  KERNEL del juego
  177. ;;;;;;;;;;;;;;;;;;;;;;
  178.  
  179. PartidaOne      PROC
  180.                 CALL    CreaVirtual     ;  Pido una pantalla virtual.
  181.                 CALL    TrataError
  182.                 MOV     [HdlJuego], AL
  183.  
  184.    @@NoMeVale:
  185.                 CALL    Aleatorio       ;  Inicialización.
  186.                 AND     AL, 00000011b
  187.                 JZ    @@NoMeVale        ;  Reiniciar.
  188.                 AND     AH, 00000011b
  189.                 JZ    @@NoMeVale        ;  Reiniciar.
  190.                 MOV     [XINCbola], AL
  191.                 MOV     [YINCbola], AH
  192.                 MOV     [XBate1], 150
  193.                 MOV     [XBate2], 150   ;  Posiciones iniciales de los bates.
  194.                 MOV     [N], 0
  195.                 MOV     [Ybola], 100
  196.  
  197.  @@Entre60y250: CALL    Aleatorio
  198.                 XOR     AH, AH
  199.                 CMP     AX, 60
  200.                 JB    @@Entre60y250
  201.                 CMP     AX, 250
  202.                 JA    @@Entre60y250     ;  Sencillo procedimiento de repetición
  203.                 MOV     [Xbola], AX     ; para encontrar un valor adecuado.
  204.  
  205.  @@BuclePrincipal:
  206.                 CMP     [FlechaIzq], 1
  207.                 JNE   @@NoIzq
  208.                 SUB     [Xbate1], 3
  209.                 JNS   @@NoIzq
  210.                 MOV     [Xbate1], 0
  211.  @@NoIzq:       CMP     [FlechaDer], 1
  212.                 JNE   @@NoDer
  213.                 ADD     [Xbate1], 3
  214.                 CMP     [Xbate1], 320-LONGxBATE
  215.                 JB    @@NoDer
  216.                 MOV     [Xbate1], 320-LONGxBATE
  217.  @@NoDer:       CALL    MueveComputer   ;  Le toca al ordenador.
  218.                 MOVSX   DX, [XINCbola]
  219.                 MOVSX   CX, [YINCbola]
  220.                 ADD     [Xbola], DX
  221.                 ADD     [Ybola], CX     ;  Movimiento de la bola.
  222.  
  223.                 CMP     [Xbola], 320-LONGxBOLA
  224.                 JNA   @@NoMuyDer        ;  Se sale por la derecha?
  225.                 NEG     [XINCbola]
  226.                 JMP   @@Representacion
  227.  @@NoMuyDer:    CMP     [Xbola], LONGxBOLA
  228.                 JNB   @@NoMuyIzq        ;  Se sale por la izquierda?
  229.                 NEG     [XINCbola]
  230.                 JMP   @@Representacion
  231.  @@NoMuyIzq:    CMP     [Ybola], 170
  232.                 JA    @@CMPChoke        ;  Vamos a ver si rebota...
  233.                 CMP     [Ybola], 30
  234.                 JNB   @@Representacion
  235.  @@CMPChoke:    CMP     [YINCbola], 4
  236.                 JB    @@Abajo
  237.                 MOV     DX, [Xbate2]    ;  Choke palo arriba?
  238.                 CMP     [Xbola], DX
  239.                 JB    @@NoLaPilla
  240.                 ADD     DX, 30
  241.                 CMP     [Xbola], DX
  242.                 JA    @@NoLaPilla
  243.                 NEG     [YINCbola]
  244.                 MOV     [N], 0
  245.                 JMP   @@Representacion
  246.  @@Abajo:       MOV     DX, [Xbate1]    ;  Choke palo abajo?
  247.                 CMP     [Xbola], DX
  248.                 JB    @@NoLaPilla
  249.                 ADD     DX, 30
  250.                 CMP     [Xbola], DX
  251.                 JA    @@NoLaPilla
  252.                 NEG     [YINCbola]
  253.                 MOV     [N], 0
  254.                 JMP   @@Representacion
  255.  @@NoLaPilla:   INC     [N]
  256.                 CMP     [N], 5
  257.                 JBE   @@Representacion
  258.                         ;;  FIN del juego  -->  GAME OVER
  259.                 XOR     DX, DX
  260.                 MOV     CX, 0FFFFh
  261.                 CALL    FadeDown        ;  Borra la pantalla.
  262.                 CALL    TrataError
  263.                 MOV     AL, [HdlJuego]
  264.                 CALL    DestVirtual
  265.                 CALL    TrataError
  266.                 RET
  267.  
  268.   @@Representacion:
  269.                 PUSH    BP
  270.                 MOV     AH, [HdlJuego]
  271.                 MOV     AL, [HdlFondJuego]
  272.                 CALL    CopiaPantalla
  273.                 CALL    TrataError      ;  Dibuja el fondo.
  274.                 MOV     AL, [HdlJuego]
  275.                 MOV     AH, [HdlSprBola]
  276.                 MOV     BP, [Xbola]
  277.                 MOV     BX, [Ybola]
  278.                 CALL    DibujaSprite
  279.                 CALL    TrataError      ;  Dibuja el sprite de la bola.
  280.                 MOV     AL, [HdlJuego]
  281.                 MOV     AH, [HdlSprBate]
  282.                 MOV     BX, 20
  283.                 MOV     BP, [Xbate2]
  284.                 CALL    DibujaSprite    ;  Dibuja el sprite del bate 2.
  285.                 CALL    TrataError
  286.                 MOV     AL, [HdlJuego]
  287.                 MOV     AH, [HdlSprBate]
  288.                 MOV     BX, 170
  289.                 MOV     BP, [Xbate1]
  290.                 CALL    DibujaSprite    ;  Dibuja el sprite del bate 1.
  291.                 CALL    TrataError
  292.                 WaitVR                  ;  Esperamos el retrazado.
  293.                 MOV     AL, [HdlJuego]
  294.                 XOR     AH, AH          ;  Cópia a la VGA.
  295.                 CALL    CopiaPantalla
  296.                 CALL    TrataError
  297.                 POP     BP
  298.                 JMP   @@BuclePrincipal
  299. PartidaOne      ENDP
  300.  
  301. MueveComputer   PROC                    ;  El ordenador hace movimientos muy
  302.                 MOV     AX, [Xbate2]    ; simples, se limita a seguir la bola
  303.                 ADD     AX, LONGxBATE   ; (que no es poco 8-).
  304.                 CMP     [Xbola], AX
  305.                 JA    @@Derecha
  306.                 SUB     [Xbate2], 3
  307.                 RET
  308.   @@Derecha:    ADD     [Xbate2], 3
  309.                 RET
  310. MueveComputer   ENDP
  311.  
  312. PartidaTwo      PROC                    ;  No funciona.
  313.                 RET
  314. PartidaTwo      ENDP
  315.  
  316. ;;;;;;;;;;;;;;;;;;;;;;;
  317. ;;;;  FUNCIαN PRINCIPAL
  318. ;;;;;;;;;;;;;;;;;;;;;;;
  319.  
  320. Main            PROC
  321.                 CALL    LiberaMEM
  322.                 MOV     AX, @DATA
  323.                 MOV     DS, AX
  324.  
  325.                 CALL    PonPresentacion
  326.                         ;  En modo texto una pequeña presentación del juego.
  327.                 MOV     BX, 1
  328.                 MOV     EAX, 0          ;  No ponemos nada especial.
  329.                 CALL    InicGraph       ;  Entramos en el apasionante mundo
  330.                 CALL    TrataError      ; de GRAPH.
  331.                 CALL    CargaGraficos   ;  Carga los sprites.
  332.                 CALL    INIT_TECLADO
  333.                         ;  Captura la IRQ del teclado e inserta un 
  334.                         ; controlador más adecuado.
  335.                 CALL    FlushKbd
  336.                 CALL    TrataError
  337.                         ;  Pone la pantalla en modo gráfico.
  338.  
  339. @@BucleInicial: CALL    MenuInicial
  340.                         ;  Dibuja el gráfico del menú inicial y espera la
  341.                         ; pulsación de una tecla: ESC=Salir, 1=un player,
  342.                         ; 2=dos players. Devuelve en AX el resultado.
  343.                 OR      AX, AX
  344.                 JNZ   @@Jugar
  345.                 CALL    EndGraph        ;  Regresa al modo anterior.
  346.                 CALL    TrataError
  347.                 CALL    VaciaMEM        ;  Libera TODA la memoria.
  348.                 CALL    FIN_TECLADO     ;  Devuelve control al DOS.
  349.                 MOV     AX, 4C00h
  350.                 INT     21h             ;  Salir al DOS.
  351.  
  352. @@Jugar:        CMP     AX, 2
  353.                 JZ    @@TwoPlayers
  354.                 CALL    PartidaOne      ;  Un jugador.
  355.                 JMP   @@BucleInicial
  356.                         ;  Vuelve a la pantalla de presentación.
  357. @@TwoPlayers:   CALL    PartidaTwo      ;  Si 2 jugadores.
  358.                 JMP   @@BucleInicial
  359. Main            ENDP
  360.                 END     Main
  361.